/*
 * Copyright (c) 2010-2011, okazoh_tk. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *
 *  - Redistributions of source code must retain the above copyright notice,
 *    this list of conditions and the following disclaimer.
 *  - Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *  - Neither the name of the copyright holder nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#include "Menu.h"
#include "Sample.h"
#include "alkes/win32text.h"

using namespace alkes;

const static wchar_t* s_menu_str[Menu::MENU_COUNT] = {
    L"Rectangles",
    L"Lines",
    L"Images",
    L"Transform",
    L"Polyline"
};

Menu::Menu()
{
}

Menu::~Menu()
{
}

#define KERNEL_SIZE (7)

void Menu::construct(IGraphics2DDevice* graphics, HWND hwnd, LOGFONT& lf)
{
    intrusive_ptr<IGlyphProvider> provider(Win32GlyphProvider::create(hwnd, lf));
    intrusive_ptr<ImageBufferFactory> factory(graphics->createImageBufferFactory());
//    intrusive_ptr<GaussianFilter> filter(GaussianFilter::create(factory, 3, 0.849321800288f));
    intrusive_ptr<GaussianFilter> filter(GaussianFilter::create(factory, KERNEL_SIZE, 3.0f));
    intrusive_ptr<ImageBuffer> image(0);
    intrusive_ptr<ImageBuffer> shadow(0);

    IGlyphProvider::TextMetrics metrics = provider->getTextMetrics();

    int16_t top = 10;
    int i = 0;
    uint16_t text_width;
    for (i = 0; i < Menu::MENU_COUNT; ++i)
    {
        provider->getTextWidth(s_menu_str[i], text_width);
        image = factory->createImageBuffer(text_width, metrics.height, AL_PIXEL_FORMAT_A8);
        if (provider->renderText(s_menu_str[i], *image, 0, 0, true))
        {
            ImageShapeNode::construct(menu_[MENU_COUNT+i], graphics, image, UPoint2D(10, top), Color::WHITE);
        }

        if (filter->apply(image, &shadow))
        {
            ImageShapeNode::construct(menu_[i], graphics, shadow, UPoint2D(10, top), Color::BLACK);
        }

        click_area_[i].width = text_width;
        click_area_[i].height = metrics.height;
        click_area_[i].x = 10;
        click_area_[i].y = top;

        top += (metrics.height + 2);
    }

    for (i = 0; i < sizeof(menu_)/sizeof(menu_[0]); ++i)
        addChild(menu_ + i);
}

int32_t Menu::getCurrentMenu(uint16_t x, uint16_t y)
{
    int32_t i;
    for (i = 0; i < Menu::MENU_COUNT; ++i)
    {
        if (click_area_[i].contains(x, y))
        {
            return i;
        }
    }
    return -1;
}
